package proyectoX.src.entidades;

import java.awt.Point;
import java.awt.Rectangle;
import java.util.Random;

import javax.swing.ImageIcon;

import proyectoX.src.aplicacion.Nivel;
import proyectoX.src.armas.LaserJefe;

/**
 * Jefe final del primer nivel. Tiene un patrón de desplazamiento y tiene dos
 * tipos de disparos.
 *
 */
public class Jefe extends Enemiga {

	protected boolean bajar;
	protected boolean moverHaciaDerecha;
	protected Random generador;
	
	/**
	 * Crea a la nave Jefe con los datos pasados por parámetro.
	 * @param nivel Nivel actual.
	 * @param ref Imagen a utilizar.
	 */
	public Jefe(Nivel nivel, ImageIcon ref) {
		super(nivel, 10, ref, 200, 500);		//datos de prueba
		bajar = true;
		moverHaciaDerecha = false;
		generador = new Random();
		laserE = new LaserJefe(nivel);
	}

	@Override
	/**
	 * Desplaza a la nave. Primero cae verticalmente hasata llegar a una posición Y superior
	 * a 100. Luego el patrón es moverse horizontalmente subiendo y bajando un poco en cada
	 * paso aleatoriamente.
	 */
	public void mover() {
		Point position = getLocation();
		
		if (bajar) {
			setLocation(getX(), getY()+velocidad);
			if (getY() >= 100) {
				bajar = false;
				moverHaciaDerecha = true;
			}
		}
		else {
			int rndmY = 0;
			if (generador.nextInt(2) == 0) {
				if (getY() >= 20) {
					rndmY = -4;
				}
			}
			else {
				if (getY() <= 150) {
					rndmY = 4;
				}
			}
			
			if (moverHaciaDerecha) {
				setLocation(getX()+velocidad, getY()+rndmY);
				if (getX() >= 400) {
					moverHaciaDerecha = false;
				}
			}
			else {
				setLocation(getX()-velocidad, getY()+rndmY);
				if (getX() <= 50) {
					moverHaciaDerecha = true;
				}
			}
		}
		
	}

	@Override
	/**
	 * Realiza uno de sus dos disparos.
	 */
	public void disparar(Point location) {
		laserE.disparar(location);
	}

	@Override
	/**
	 * Devuelve el área de colisión. 
	 * @return Área de colisión. 
	 */
	public Rectangle getBounds() {
		return new Rectangle(getX(), getY(), getWidth(), 40);
	}
	
	/**
	 * Al morir indica al nivel que el jugador ha ganado.
	 */
	public void muerte() {
		super.muerte();
		nivel.jefeDerrotado();
	}

}
